/*
 * @Descripttion: 
 * @version: 
 * @Author: Lee
 * @Date: 2020-06-10 16:18:32
 * @LastEditors: Please set LastEditors
 * @LastEditTime: 2020-06-11 10:33:15
 */
let oldArrayMethods = Array.prototype; //获取数组原型上的方法
// 创建一个全新的对象 可以找到数组原型上的方法 而且修改对象时不会影响原数组的原型方法
export let arrayMethods = Object.create(oldArrayMethods);

// console.log()
let methods = [
    'push',
    'pop',
    'shift',
    'unshift',
    'sort',
    'reverse',
    'splice'
]
methods.forEach(method => {
    arrayMethods[method] = function (...args) { // 函数劫持 AOP
        // 当用户调用数组方法时 会执行我自己改造的逻辑 再执行数组默认的逻辑
        console.log('新增')
        const ob = this._ob_;
        let result = oldArrayMethods[method].apply(this, args);
        let inserted; // 记录用户插入的新值
        // push unshift splice 都可以新增属性 （新增的属性可能是一个对象类型）
        // 内部还对数组中引用类型也做了一次劫持 [].push({name: 'zf'})
        switch (method) {
            case 'push':
            case 'unshift':
                inserted = args;
                break;
            case 'splice':
                inserted = args.slice(2);
                break;
            default:
                break;
        }
        inserted && ob.observeArray(inserted)
        return result;

    }
})